package com.example.administrator.exkotlin.multithread

import android.app.Activity
import android.os.AsyncTask
import android.util.Log
import android.widget.Toast
import java.lang.ref.WeakReference


/**
 * Author by lp,on 2020/8/5/005,17:07.
 * AsyncTask的例子
 * 构造函数<parms1,parms2,parms3> parms1传入参数的类型，parms2计算中的进度类型，parms3完成后的结果类型
 */
class MutiAsyncTask(val Activty: WeakReference<Activity>) : AsyncTask<Int, Int, Boolean>() {
    val activity = Activty.get() as MultithreadActivity

    //后台任务开始之前会被调用，用于进行一些初始化操作，比如弹出提示框等
    override fun onPreExecute() {
        super.onPreExecute()
        Toast.makeText(Activty.get(), "开始", Toast.LENGTH_SHORT).show()
    }

    //这个方法在子线程中进行，结束后通return可以返回结果，但在运行中不可以更新ui，可以使用publishProgress()来调用onProgressUpdate进行更新ui
    override fun doInBackground(vararg params: Int?): Boolean {
        if (activity == null) {
            return false
        }
        var param = params[0] ?: 0
        while (param < 100 && !isCancelled) {
            publishProgress(param)
            param++
            Log.i("MultithreadActivity", "进度：${param}" + isCancelled)
            try {
                Thread.sleep(100)
            } catch (e: InterruptedException) {
                e.printStackTrace()
            }
        }
        return true
    }

    //后台任务调用了可以使用publishProgress（）来更新ui
    override fun onProgressUpdate(vararg values: Int?) {
        super.onProgressUpdate(*values)
        activity?.updataUi()
    }

    //任务执行结束，通过return返回时，这个方法会被调用，返回的数据会传到这里，方便我们进行一些ui操作，比如弹窗提醒任务结束等
    override fun onPostExecute(result: Boolean?) {
        super.onPostExecute(result)
        Toast.makeText(Activty.get(), "完成", Toast.LENGTH_SHORT).show()
    }

    override fun onCancelled() {
        super.onCancelled()
        Log.i("MultithreadActivity", "退出")
    }

}